package bitclub;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class BitUtil {

    /**
     * Borra la pantalla :S
     */
    public static void borra() {
        for (int i = 0; i < 50; i++) {
            System.out.println("");
        }
    }

    /**
     * Pide una cadena a través del teclado y la devuelve
     */
    public static String dameCadena(String mensaje) {
        String cadena;
        Scanner scan = new Scanner(System.in);

        System.out.print(mensaje);
        cadena = scan.nextLine();
        return cadena;
    }

    /**
     * Pide una cadena a través del teclado y la devuelve
     * Seguirá pidiendo la cadena hasta que tenga menos caracteres que maxCar
     */
    public static String dameCadena(String mensaje, int maxCar) {
        String cadena;
        boolean error;
        do {
            error = false;
            cadena = dameCadena(mensaje);
            if (cadena.length() > maxCar) {
                System.out.println("El texto es demasiado largo");
                error = true;
            }
        } while (error);
        return cadena;
    }

    /**
     * Pide un entero a través del teclado y lo devuelve.
     * Seguirá pidiendo el valor hasta que sea válido.
     */
    public static int dameEntero(String mensaje) {
        int numero = 0;
        String respuesta;
        boolean error;
        do {
            error = false;
            respuesta = dameCadena(mensaje);
            if (respuesta.length() == 0) {
                System.out.println("Debe introducir un valor entero");
                error = true;
            }
            try {
                numero = Integer.parseInt(respuesta);
            } catch (NumberFormatException a) {
                System.out.println("El valor introducido no es válido");
                error = true;
            }
        } while (error);
        return numero;
    }

    /**
     * Pide un double a través del teclado y lo devuelve.
     * Seguirá pidiendo el valor hasta que sea válido.
     */
    public static double dameDouble(String mensaje) {
        double numero = 0;
        String respuesta;
        boolean error;
        do {
            error = false;
            respuesta = dameCadena(mensaje);
            if (respuesta.length() == 0) {
                System.out.println("Debe introducir un valor numérico");
                error = true;
            }
            try {
                numero = Double.parseDouble(respuesta);
            } catch (NumberFormatException a) {
                System.out.println("El valor introducido no es válido");
                error = true;
            }
        } while (error);
        return numero;
    }

    /**
     * Muestra un menú por pantalla y espera hasta que la opción seleccionada
     * sea válida.
     */
    public static int muestraMenu(String titulo, String[] opcion) {
        int respuesta;
        respuesta = muestraMenu(titulo, opcion, "Salir");
        return respuesta;
    }

    /**
     * Muestra un menú por pantalla y espera hasta que la opción seleccionada
     * sea válida. Recibe título, opciones[] y texto de salida.
     */
    public static int muestraMenu(String titulo, String[] opcion, String salir) {
        String respuestaString = "";
        int respuesta = 0;
        System.out.println(titulo);
        System.out.println("--------------------");
        for (int i = 0; i < opcion.length; i++) {
            if (i < 9) {
                System.out.print(" ");
            }
            System.out.print((i + 1) + ".- " + opcion[i] + "\n");
        }
        System.out.println(" 0.- " + salir);
        System.out.println("--------------------");

        boolean error = false;
        do {
            try {
                error = false;
                System.out.print("Opcion: ");
                Scanner scan = new Scanner(System.in);
                respuestaString = scan.nextLine();
                respuesta = Integer.parseInt(respuestaString);
            } catch (NumberFormatException excep) {
                System.out.println("Introduzca solamente números, por favor");
                error = true;
            }

            if (respuesta < 0 || respuesta > opcion.length) {
                System.out.println("La opcion solicitada no existe");
                error = true;
            }
        } while (error);

        //En caso de introducir un Cero-Cero bajamos al menú principal
        if (respuestaString.equals("00")) {
            return -1;
        }
        return respuesta;

    }

    /**
     * Pide un DNI (valor entero) a través del teclado y lo devuelve.
     * Seguirá pidiendo el valor hasta que sea un DNI válido.
     * @deprecated Usa mejor el dameEntero con número fijo de caracteres
     */
    @Deprecated
    public static String dameDni(String mensaje) {
        String dni;
        double dniDouble;
        boolean error;
        do {
            error = false;
            dni = dameCadena(mensaje);
            if (dni.length() != 8) {
                error = true;
                System.out.println("El número de cifras no es correcto");
            }
            try {
                //Para comprobar que es un DNI aparte de 8 caracteres vemos si es un número
                dniDouble = Double.parseDouble(dni);
            } catch (NumberFormatException a) {
                error = true;
                System.out.println("Introduzca solamente numeros");
            }
        } while (error);
        return dni;
    }

    /**
     * Muestra un texto pidiendo que se pulse Enter
     */
    public static void esperaEnter() {
        System.out.print("Pulse Enter para continuar...");
        try {
            System.in.read();
        } catch (Exception e) {
        }
    }

    /**
     * Pide confirmación por pantalla con (S/N) y devuelve un boolean.
     * Seguirá pidiendo el valor hasta que sea válido. S:True / N:False
     */
    public static boolean dameConfirmacion(String mensaje) {
        boolean siONo = false;
        String respuesta;
        boolean error;
        do {
            error = true;
            respuesta = dameCadena(mensaje);
            if (respuesta.equals("s") || respuesta.equals("S")) {
                siONo = true;
                error = false;
            }
            if (respuesta.equals("n") || respuesta.equals("N")) {
                siONo = false;
                error = false;
            }
        } while (error);
        return siONo;
    }

    public static Date dameFecha(String mensaje) { //queda por controlar que los meses sean 12 y los dias respecto cada mes
        String cadena;
        Date fecha = null;
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        boolean error = true;

        Scanner scan = new Scanner(System.in);

        do {
            try {
                System.out.print(mensaje);
                cadena = scan.nextLine();
                fecha = df.parse(cadena);
                error = false;
            } catch (ParseException pe) {
                System.out.println("Formato de fecha no valido (dd/MM/yyyy)");
            }
        } while (error);
        return fecha;
    }

    /**
     * Pide un Telefono (valor entero) a través del teclado y lo devuelve.
     * Seguirá pidiendo el valor hasta que sea un Telefono válido.
     * @deprecated Usa mejor dameEntero con número fijo de caracteres
     */
    @Deprecated
    public static String dameTelefono(String mensaje) {
        String telefono;
        Double telefonoDouble;

        boolean error;
        do {
            error = false;
            telefono = dameCadena(mensaje);
            if (mensaje.length() != 9) {
                error = true;
                System.out.println("El número de cifras no es correcto");
            }
            try {
                //Para comprobar que es un Telefono aparte de 8 caracteres vemos si es un número
                telefonoDouble = Double.parseDouble(telefono);
            } catch (NumberFormatException a) {
                error = true;
                System.out.println("Introduzca solamente numeros");
            }
        } while (error);
        return telefono;
    }

    /**
     * Pide un entero con un número fijo de caracteres a través del teclado y lo devuelve.
     * Seguirá pidiendo el valor hasta que sea válido.
     */
    public static String dameEnteroFijo(String mensaje, int numCar) {
        int numero = 0;
        String respuesta;
        boolean error;
        do {
            error = false;
            respuesta = dameCadena(mensaje);
            if (respuesta.length() != numCar) {
                System.out.println("El número de cifras no es correcto");
                error = true;
            }
            try {
                numero = Integer.parseInt(respuesta);
            } catch (NumberFormatException a) {
                System.out.println("El valor introducido no es válido");
                error = true;
            }
        } while (error);
        return Integer.toString(numero);
    }

    /**
     * Pide un dia de la semana, basta con la primera letra excepto para martes
     * y miércoles que mira las dos primeras. Devuelve un string con el nombre del día
     */
    public static String dameDiaSemana(String mensaje) {
        String dia;

        boolean error;
        do {
            error = true;
            dia = dameCadena(mensaje);

            if (dia.startsWith("l") || dia.contains("L")) {
                error = false;
                dia = "lunes";
            }
            if (dia.startsWith("ma") || dia.contains("Ma")) {
                error = false;
                dia = "martes";
            }
            if (dia.startsWith("mi") || dia.contains("Mi")) {
                error = false;
                dia = "miercoles";
            }
            if (dia.startsWith("j") || dia.contains("J")) {
                error = false;
                dia = "jueves";
            }
            if (dia.startsWith("v") || dia.contains("V")) {
                error = false;
                dia = "viernes";
            }
            if (dia.startsWith("s") || dia.contains("S")) {
                error = false;
                dia = "sabado";
            }
            if (dia.startsWith("d") || dia.contains("D")) {
                error = false;
                dia = "domingo";
            }

            if (error) {
                System.out.println("Introduzca un día de la semana valido");
            }

        } while (error);
        return dia;
    }

    /**
     * Devuelve un String con la fecha en formato 'bonito y español'
     * @param fecha Un Date con la fecha
     * @return Un String
     */
    public static String muestraFecha(Date fecha) {
        String[] nombreMes = new String[]{"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
        String fechaString;
        Calendar cal = new GregorianCalendar();
        cal.setTime(fecha);
        String dia = Integer.toString(cal.get(Calendar.DAY_OF_MONTH));
        String mes = nombreMes[cal.get(Calendar.MONTH)];
        String año = Integer.toString(cal.get(Calendar.YEAR));
        fechaString = dia + "/" + mes + "/" + año;
        //Podría venir bien que aparezca también el día de la semana
        return fechaString;
    }

    public static boolean checkMail(String user_mail) {
        //Método que devuelve true o false dependiendo del contenido del mail introducido-Debe tener una arroba y un punto
        String cadena = BitUtil.dameCadena(user_mail);
        boolean contiene_arroba = cadena.contains("@");
        boolean contiene_punto = cadena.contains(".");

        if (contiene_arroba == true && contiene_punto == true) {
            return true;
        } else {
            return false;
        }


    }

    
}
